--- /dev/null
+<?php\r
+\r
+/*\r
+ * Created on Monday, January 28, 2008\r
+ *\r
+ * API for MediaWiki 1.8+\r
+ *\r
+ * Copyright (C) 2008 Brent Garber\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along\r
+ * with this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+ * http://www.gnu.org/copyleft/gpl.html\r
+ */\r
+\r
+if (!defined('MEDIAWIKI')) {\r
+ // Eclipse helper - will be ignored in production\r
+ require_once ('ApiQueryBase.php');\r
+}\r
+\r
+/**\r
+ * Query module to get list of random pages\r
+ * \r
+ * @addtogroup API\r
+ */\r
+ \r
+ class ApiQueryRandom extends ApiQueryGeneratorBase {\r
+\r
+ public function __construct($query, $moduleName) {\r
+ parent :: __construct($query, $moduleName, 'rn');\r
+ }\r
+ \r
+ public function execute() {\r
+ $this->run();\r
+ }\r
+ \r
+ public function executeGenerator($resultPageSet) {\r
+ $this->run($resultPageSet);\r
+ }\r
+\r
+ public function run($resultPageSet = null) {\r
+ $params = $this->extractRequestParams();\r
+ $result = $this->getResult();\r
+ $randstr = wfRandom();\r
+ $data = array();\r
+\r
+ $this->addTables('page');\r
+ $this->addOption('LIMIT', $params['limit']);\r
+ $this->addWhereFld('page_namespace', $params['namespace']);\r
+ $this->addWhereRange('page_random', 'newer', $randstr, null);\r
+ $this->addWhere(array('page_is_redirect' => 0));\r
+ $this->addOption('USE INDEX', 'page_random');\r
+ if(is_null($resultPageSet))\r
+ $this->addFields(array('page_id', 'page_title', 'page_namespace'));\r
+ else\r
+ $this->addFields($resultPageSet->getPageTableFields());\r
+\r
+ $db = $this->getDB();\r
+ $res = $this->select(__METHOD__);\r
+ while($row = $db->fetchObject($res)) {\r
+ if(is_null($resultPageSet))\r
+ $data[] = $this->extractRowInfo($row);\r
+ else\r
+ $resultPageSet->processDbRow($row);\r
+ }\r
+ $db->freeResult($res);\r
+\r
+ if(is_null($resultPageSet)) {\r
+ $result->setIndexedTagName($data, 'page');\r
+ $result->addValue('query', $this->getModuleName(), $data);\r
+ } \r
+ }\r
+\r
+ private function extractRowInfo($row) {\r
+ $title = Title::makeTitle($row->page_namespace, $row->page_title);\r
+ $vals = array();\r
+ $vals['title'] = $title->getPrefixedText();\r
+ $vals['ns'] = $row->page_namespace;\r
+ $vals['id'] = $row->page_id;\r
+ return $vals;\r
+ }\r
+ \r
+ protected function getAllowedParams() {\r
+ return array (\r
+ 'namespace' => array(\r
+ ApiBase :: PARAM_TYPE => 'namespace',\r
+ ApiBase :: PARAM_ISMULTI => true\r
+ ),\r
+ 'limit' => array (\r
+ ApiBase :: PARAM_TYPE => 'limit',\r
+ ApiBase :: PARAM_DFLT => 1,\r
+ ApiBase :: PARAM_MIN => 1,\r
+ ApiBase :: PARAM_MAX => 10,\r
+ ApiBase :: PARAM_MAX2 => 20\r
+ ),\r
+ );\r
+ }\r
+\r
+ protected function getParamDescription() {\r
+ return array (\r
+ 'namespace' => 'Return pages in these namespaces only',\r
+ 'limit' => 'Limit how many random pages will be returned'\r
+ );\r
+ }\r
+\r
+ protected function getDescription() {\r
+ return array( 'Get a set of random pages',\r
+ 'NOTE: When using a namespace filter, this module may return an empty result. In that case, retry the request'\r
+ );\r
+ }\r
+\r
+ protected function getExamples() {\r
+ return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';\r
+ }\r
+\r
+ public function getVersion() {\r
+ return __CLASS__ . ': $Id: ApiQueryRandom.php overlordq$';\r
+ }\r
+}\r